/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.ui;

import fait.ferm.global.Glob;
import fait.ferm.persists.Equipment;
import fait.ferm.persists.Equipment_breakdown;
import fait.ferm.persists.Equipment_staff;
import fait.ferm.persists.Staff_table;
import fait.ferm.persists.Staff_type;
import fait.ferm.tools.Tools;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.BorderPane;

/**
 *
 * @author Greg
 */
public class EquipmentTabController implements Initializable {
    @FXML
    public ListView equipment_list;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //получаем массивы оборудования и персонала фермы
        ArrayList<Equipment> arr_equipment = (ArrayList<Equipment>)Glob.getFermEngine().getEquipment().obj;
        ArrayList<Staff_table> arr_staff = (ArrayList<Staff_table>)Glob.getFermEngine().getStaff_table().obj;
        ObservableList model_equipment = equipment_list.getItems(); //получаем модель листа для вывода
        
        for(int i = 0; i < arr_equipment.size(); ++i) {
            final Equipment cur_equipment = arr_equipment.get(i); //текущее оборудование
            
            boolean notWork = false; //оборудование функционирует
            
            //создаём контролы для вывода
            BorderPane bp_root = new BorderPane();
            Label name = new Label();
            final ListView trebovaniya = new ListView();
            final Button b = new Button("Требования для запуска");
            ProgressBar perc_wear = new ProgressBar();
            
            ObservableList model_trebovaniya = trebovaniya.getItems(); //получаем модель листа требований
            try {
                ArrayList<Equipment_staff> arr_treb = cur_equipment.get_arr_equipment_staff();
                
                //если есть поломка, выводим об этом информацию
                try {
                    Equipment_breakdown eb = new Equipment_breakdown(cur_equipment.getId());
                    if((eb != null) && (eb.summa != 0.0)) {
                        notWork = true; //оборудование не функционирует
                        model_trebovaniya.add("Ремонт на сумму " + String.format("%.2f", eb.summa));
                    }
                } catch (Exception ex) {
                    //
                }
                
                //если оборудование не имеет поломок, то в цикле проверяем требования для функционирования
                if(notWork == false) {
                    for(int e = 0; e < arr_treb.size(); ++e) {
                        Staff_table man = new Staff_table(new Staff_type(arr_treb.get(e).staff_type_id));
                        int cur_quantity = 0; //количество имеющихся сотрудников нужного типа

                        for(int ind = 0; ind < arr_staff.size(); ++ind) {
                            if(arr_staff.get(ind).name.equals(man.name)) {
                                ++cur_quantity;
                                arr_staff.remove(ind);
                                --ind;
                            }
                            if(cur_quantity == arr_treb.get(e).quantity) {
                                break;
                            }
                        }

                        //если текущее количество нужных сотрудников меньше чем, необходимое для работы, то выводим эту информацию
                        if(cur_quantity < arr_treb.get(e).quantity) {
                            notWork = true; //оборудование не функционирует

                            BorderPane bp_treb = new BorderPane();
                            Label name_man = new Label(man.name);
                            Label quantity = new Label("нужно " + (arr_treb.get(e).quantity - cur_quantity) + " из " + arr_treb.get(e).quantity);

                            bp_treb.setLeft(name_man);
                            bp_treb.setRight(quantity);
                            
                            model_trebovaniya.add(bp_treb);
                        }
                    }
                }
            } catch (Exception ex) {
                Logger.getLogger(EquipmentTabController.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            trebovaniya.setPrefHeight(0);
            trebovaniya.setVisible(false);
            
            name.setText(cur_equipment.get_equipment_type().getName() + " (" + Tools.dateToStr(cur_equipment.date_purchase) + ")");
            perc_wear.progressProperty().set(cur_equipment.percent_wear);
            //для отображения и скрытия требований
            
            b.setOnAction(new EventHandler <ActionEvent> () {

                @Override
                public void handle(ActionEvent event) {
                    trebovaniya.setVisible(!trebovaniya.isVisible());
                    
                    if(b.getText().equals("Скрыть требования")) {
                        b.setText("Требования для запуска");
                        trebovaniya.setPrefHeight(0);
                    } else {
                        b.setText("Скрыть требования");
                        trebovaniya.setPrefHeight(trebovaniya.getItems().size() * 26);
                    }
                }
            });
            
            //вывод всей информации с помощью BorderPane (bp_root)
            bp_root.setLeft(name);
            if(notWork) {
                bp_root.setCenter(b);
            } else {
                bp_root.setCenter(new Label("функционирует"));
            }
            bp_root.setBottom(trebovaniya);
            bp_root.setRight(perc_wear);
            
            model_equipment.add(bp_root);
        }
    }
    
}
